#include<iostream>
using namespace std;
//析构函数相当于Dertroy函数，构造函数相当于Init函数

// class Date1{
// public:
//     Date(int year = 1, int month = 1, int day = 1){
//         _year = year;
//         _month = month;
//         _day = day;
//         cout << "ss" << endl;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };
// int main1(){
//     // Date d1(2024, 10, 15);
//     // Date d2(2024, 10, 15);
//     //-----------想创建两个相同的对象，那么如果向上面的那种方法的话，如果改变一个，另一个要手动改

//     Date1 d1(2024, 10, 15);
//     Date1 d2(d1);//-------拷贝构造
//     Date1 d3 = d1;//------拷贝构造
// //拷贝构1造的本质是引用的传参  
//     return 0;
// }

//-----------运算符的重载

// class Date{
// public:
//     Date(int year = 1, int month = 1, int day = 1){
//         _year = year;
//         _month = month;
//         _day = day;
//         cout << "ss" << endl;
//     }
//     //3个Operator函数，实现等于，大于，小于的比较
//     bool operator==(const Date& d){
//         return _year == d._year && _month == d._month && _day == d._day;
//     }
//     bool operator>(const Date& d){
//         if(_year > d._year){
//             return true;
//         }
//         else if(_year == d._year && _month > d._month){
//             return true;
//         }
//         else if(_year == d._year && _month == d._month && _day > d._day){
//             return true;
//         }
//        return false;
//     }
//     bool operator<(const Date& d){
//         if(_year < d._year){
//             return true;
//         }
//         else if(_year == d._year && _month < d._month){
//             return true;
//         }
//         else if(_year == d._year && _month == d._month && _day < d._day){
//             return true;
//         }
//        return false;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };

// //----运算符有几个操作数，operator函数就有几个参数
// //----operator函数重载是自定义地去比较自定义类型地大小，必须自己写operator函数以实现比较的逻辑
// //----operator函数的方便之处在于可以使用“==”来比较大小，增强代码的可读性


// // bool operator==(const Date& d1, const Date& d2){
// //     return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
// //     //这儿需要使用成员变量，但是成员变量一般是private的，所以operator函数一般写在类中
// // }

// int main(){
//     Date d1(2024, 11, 1);
//     Date d2(2024, 11, 1);
//     // cout << operator==(d1, d2) << endl;
//     bool result = d1 == d2;
//     cout << result << endl;
//     cout << (d1 == d2) << endl;//--------d1 == d2要加上括号才能输出
//     cout << (d1 > d2) << endl;
//     return 0;
// }



// class Time{
// public:
//     //全缺省构造函数
//     Time(int year = 0, int month = 0, int day = 0){
//         _year = year;
//         _month = month;
//         _day = day;
//     }
//     //拷贝构造
//     Time(const Time* time){
//         _year = time->_year;
//         _month = time->_month;
//         _day = time->_day;
//     }
//     void print(){
//         cout << _year <<"-"<< _month <<"-"<< _day << endl;
//     }

// private:
//     int _year;
//     int _month;
//     int _day;
// };
// int main(){
//     Time t1(2025, 1, 21);
//     t1.print();
//     //调用拷贝构造
//     Time t2(&t1);
//     t2.print();
//     return 0;
// }

// class Time{
//     public:
//     Time(int year = 0, int month = 0, int day = 0){
//         _year = year;
//         _month = month;
//         _day = day;
//     }
    
//     bool operator<(const Time& t2){
//         return _year < t2._year && _month < t2._month && _day < t2._day;
//     }
//     bool operator++(){
//         return _year++;
//     }
//     private:
//     int _year;
//     int _month;
//     int _day;
// };
// //运算符重载
// //这儿没有拷贝构造函数，编译器自动创建一个拷贝构造函数
// //也就是说只要类的实例化对象作为参数传递就是调用拷贝构造函数，使用引用传递
// // bool operator==(const Time& t1, const Time& t2){
// //     return t1._year == t2._year && t1._month == t2._month && t1._day == t2._day;
// // }
// int main()
// {
//     Time time1(2025, 1, 21);
//     Time time2(2025, 1, 21);
//     // cout << (time1 == time2) << endl;
//     cout << (time1 < time2) << endl;
//     // cout << time2++ <<endl;
//     return 0;
// }

//完善的实现日期类
class Date{
private:
    int _year;
    int _month;
    int _day;

public:
//构造函数不合理
    int GetMonthDay(int year, int month){
        int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){
            return 29;
        }
        return days[month];
    }
    Date(int year = 0, int month = 1, int day = 1){
        if(year > 0 && month >= 1 && month <= 12 && day >= 1 && day <= GetMonthDay(year, month)){
            _year = year;
            _month = month;
            _day = day;
        }
       else{
        cout << "日期错误" << endl;
       }
    }
    //拷贝构造
    Date(const Date& d){
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
    void print(){
        cout << _year << "-" << _month << "-" << _day << endl;
    }

    //运算符重载
    bool operator<(const Date& d){
        if(_year < d._year){
            return true;
        }
        else if(_year == d._year && _month < d._month){
            return true;
        }
        else if(_year == d._year && _month == d._month && _day < d._day){
            return true;
        }
        else{
            return false;
        }
    }
     bool operator==(const Date& d){
        if(_year == d._year && _month == d._month && _day == d._day){
            return true;
        }
        else{
            return false;
        }
    }
    //复用运算符，好处就是添加成员变量的时候不用大幅度修改成员方法
    bool operator>(const Date& d){
        return !(*this <= d);
    }
   
    bool operator!=(const Date& d){
        return !(*this == d);
    }
    bool operator<=(const Date& d){//bool operator<=(Date* this, const Date& d)
        return *this < d || *this == d;
    }
    bool operator>=(const Date& d){
        return *this > d || *this == d;
    }

    Date operator+(int days){
        Date ret(*this);
        ret._day += days;
        while (ret._day > GetMonthDay(ret._year, ret._month)) {
            ret._day -= GetMonthDay(ret._year, ret._month);
            ret._month++;
            if (ret._month > 12) {
                ret._year++;
                ret._month = 1;
            }
        }
        return ret;
    }
};

int main(){
    Date d1;
    d1.print();
    Date d2(2024, 2, 10);
    
    // cout << (d1 < d2) << endl;
    // cout << (d1 > d2) << endl;
    // cout << (d1 == d2) << endl;
    // cout << (d1 != d2) << endl;
    // cout << (d1 <= d2) << endl;
    // cout << (d1 >= d2) << endl;

    Date d3 = d2 + 1000;
    d3.print();
    return  0;
}